package com.ruoyi.system.mapper;

import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;

/**
 * 数据统计分析Mapper接口
 *
 * @author ltr
 * @date 2024-11-19
 */
public interface StatisticsMapper
{
    // ==================== 总体概览统计 ====================

    /**
     * 统计学生总数
     */
    int countTotalStudents();

    /**
     * 统计教师总数
     */
    int countTotalTeachers();

    /**
     * 统计题目总数
     */
    int countTotalTopics();

    /**
     * 统计已审核通过的题目数
     */
    int countApprovedTopics();

    /**
     * 统计申请总数
     */
    int countTotalApplications();

    /**
     * 统计已录取的申请数
     */
    int countAcceptedApplications();

    /**
     * 统计变更申请总数
     */
    int countTotalChangeRequests();

    /**
     * 统计各状态题目数量
     */
    List<Map<String, Object>> countTopicsByStatus();

    /**
     * 统计各状态申请数量
     */
    List<Map<String, Object>> countApplicationsByStatus();

    // ==================== 题目相关统计 ====================

    /**
     * 统计题目按难度分布
     */
    List<Map<String, Object>> countTopicsByDifficulty();

    /**
     * 统计题目按审核状态分布
     */
    List<Map<String, Object>> countTopicsByAuditStatus();

    /**
     * 统计题目报名热度排行（前10）
     */
    List<Map<String, Object>> getTopicPopularityRanking(@Param("limit") int limit);

    /**
     * 统计题目录取率排行
     */
    List<Map<String, Object>> getTopicAcceptanceRanking(@Param("limit") int limit);

    /**
     * 统计各标签的题目数量（需要在Service层处理JSON）
     */
    List<String> getAllTopicTags();

    // ==================== 教师相关统计 ====================

    /**
     * 统计教师指导学生数排行
     */
    List<Map<String, Object>> getTeacherStudentRanking(@Param("limit") int limit);

    /**
     * 统计教师题目发布数量排行
     */
    List<Map<String, Object>> getTeacherTopicRanking(@Param("limit") int limit);

    /**
     * 统计教师按职称分布
     */
    List<Map<String, Object>> countTeachersByTitle();

    /**
     * 统计教师录取率排行
     */
    List<Map<String, Object>> getTeacherAcceptanceRanking(@Param("limit") int limit);

    /**
     * 统计教师指导学生数分布区间
     */
    List<Map<String, Object>> getTeacherStudentDistribution();

    // ==================== 学生相关统计 ====================

    /**
     * 统计学生按年级分布
     */
    List<Map<String, Object>> countStudentsByGrade();

    /**
     * 统计学生按专业分布
     */
    List<Map<String, Object>> countStudentsByMajor();

    /**
     * 统计学生录取状态
     */
    Map<String, Object> getStudentAcceptanceStatus();

    /**
     * 统计学生GPA分布区间
     */
    List<Map<String, Object>> getStudentGpaDistribution();

    // ==================== 申请相关统计 ====================

    /**
     * 统计第一志愿录取率
     */
    Map<String, Object> getFirstPriorityAcceptanceRate();

    /**
     * 统计第二志愿录取率
     */
    Map<String, Object> getSecondPriorityAcceptanceRate();

    /**
     * 统计近N天的申请趋势
     */
    List<Map<String, Object>> getApplicationTrend(@Param("days") int days);

    /**
     * 统计近N天的录取趋势
     */
    List<Map<String, Object>> getAcceptanceTrend(@Param("days") int days);

    /**
     * 统计申请审核平均时长（小时）
     */
    Map<String, Object> getAverageReviewTime();

    // ==================== 变更申请统计 ====================

    /**
     * 统计变更申请按状态分布
     */
    List<Map<String, Object>> countChangeRequestsByStatus();

    /**
     * 统计变更申请通过率
     */
    Map<String, Object> getChangeRequestPassRate();

    /**
     * 统计近N天的变更申请趋势
     */
    List<Map<String, Object>> getChangeRequestTrend(@Param("days") int days);

    // ==================== 时间趋势分析 ====================

    /**
     * 统计近N天题目发布趋势
     */
    List<Map<String, Object>> getTopicPublishTrend(@Param("days") int days);

    /**
     * 统计每月申请数量趋势（近12个月）
     */
    List<Map<String, Object>> getMonthlyApplicationTrend();

    /**
     * 统计每月录取数量趋势（近12个月）
     */
    List<Map<String, Object>> getMonthlyAcceptanceTrend();
}